home *** CD-ROM | disk | FTP | other *** search
- * add.sig 08/18/83
- *******************************************************************
- * THIS MODULE ADDS RECORDS TO THE ORDERS (SIG/M) DATA BASE.
- * IT IS WELL WORTH PRINTING OUT AND STUDYING BECAUSE IT CON-
- * TAINS MANY PRACTICAL HINTS FOR WRITING A dBASE PROGRAM.
- * COMMENTS ARE INSERTED AT APPROPRIATE POINTS IN THE FILE.
- * COMMENTS ALREADY IN MAIN.SIG ARE NOT REPEATED.
- ******************************************************************
- * WE WANT TO GET RID OF THE INDEX WHEN WE ADD. IF YOU
- * HAVE A SMALL DATA BASE IT IS OK - BUT OTHERWISE YOU
- * HAVE TO WAIT FOR EACH RECORD TO BE INDEXED. MOST COMMERCIAL
- * PROGRAMS INDEX EVERY TIME AND IT COSTS YOU TIME. HERE WE
- * GIVE YOU THE OPTION OF INDEXING OR NOT WHEN YOU EXIT. IF
- * YOU DO NOT, THE RECORDS ARE THERE, BUT YOU WILL NOT FIND
- * THEM EXCEPT BY THE STRING SEARCH IN SEARCH1.SIG (SINCE IT
- * USES THE 'LOCATE FOR' COMMAND TO FIND NON INDEXED DATA.
- * THE INDEX IS STILL ON - SO WE TAKE IT OFF
- SET INDEX TO
- ERASE
- STORE t TO first
- STORE t TO more
- * because we use three screens in this add - it makes for a neater
- * screen if we get rid of the colons around the add field
- SET COLON OFF
- DO WHILE more
- IF first
- * get record number for automatic order number addition
- GOTO bottom
- @ 2, 0 SAY "+---------------------------------------"
- @ 2,39 SAY "---------------------------------------+"
- @ 3, 5 SAY "ORDER NUMBER:"
- @ 3,43 SAY "Complete:"
- @ 4, 8 SAY "Last name:"
- @ 4,46 SAY "First:"
- @ 5,10 SAY "Address:"
- @ 6, 9 SAY "(line 2):"
- @ 7, 9 SAY "(line 3):"
- @ 8,13 SAY "City:"
- @ 8,46 SAY "State:"
- @ 8,65 SAY "ZIP:"
- @ 9,11 SAY "Amount:"
- @ 9,46 SAY "Enter:"
- @ 9,64 SAY "Ship:"
- @ 11,00 SAY "Enter Individual Volumes Ordered (999 when done): "
- @ 12, 2 SAY "Volumes:"
- @ 14, 2 SAY "Remarks:"
- @ 15, 2 SAY "Remarks:"
- @ 16, 0 SAY "Backorder:"
- @ 17,44 SAY "Catalog:"
- @ 18, 2 SAY "Shipped:"
- @ 18,26 SAY "Shipped:"
- @ 18,62 SAY "Update:"
- @ 19, 0 SAY "+---------------------------------------"
- @ 19,39 SAY "---------------------------------------+"
- ENDIF first
- STORE f TO first
- * IN SIG/M.CMD WE HAVE SAVED OUR VARIABLES AS A FILE ADD.MEM. WE NOW
- * BRING THEM UP (NOTE - IN ADD.INV WHERE ARE VARIABLES ARE ESSENTIALLY
- * NUMERIC WE DO NOT USE THIS METHOD. IF YOU RUN THE SAME PROGRAM ON
- * BOTH CP/M 80 AND CP/M 86 FIRST DELETE ALL .MEM FILES AS THEY CANNOT
- * BE MOVED BETWEEN OPERATING SYSTEMS.
- RESTORE FROM ADD
- * WE ASSUME ENTER DATE IS TODAY
- STORE DATE() TO mentered
- STORE DATE() TO mshipped
- * we went to the bottom of the file - i.e. the last record -
- * we add one to that and get 4 digits of the order number
- STORE # TO ord:num
- STORE ord:num + 1 TO ord:num
- * change to character field from numeric
- STORE STR(ord:num,4,0) TO ord:num1
- * however, we want the order number to give us some date data
- * so we will use the date as part of the order number
- * it will be nnnnMMDDY. only way to get a duplicate order number
- * would be to add records, delete, pack and add more records on same
- * so please - pack at the end of the day
- STORE ord:num1 + $(DATE(),1,2) + $(DATE(),4,2) + $(DATE(),8,1) TO morder
- STORE 'Y' TO mcomp
- STORE 'N' TO mcatalog
- STORE 'Add Records Module' TO mode
- STORE 'Enter as many records as you want.' TO prompt1
- STORE "When done, enter 'blank' for last name" TO prompt2
- STORE "or Control 'Q' to end session" TO prompt3
- IF $(DATE(),1,2) <> '00' .AND. mdayu = ' '
- STORE DATE() to mdayu
- ENDIF
- STORE DATE() TO mshipped
- * NOTE THE SHIFTS BETWEEN GET AND SAY. THIS SCREEN IS
- * REALLY A 3 STAGE SCREEN. THE FIRST PART CONTAINS THE
- * CUSTOMER DATA. THEN WE INPUT ALL VOLUMES ORDERED AND
- * THE PROGRAM AUTOMATICALLY WRITES THEM TO THE FILE
- * UNTIL FINISHED. BECAUSE OF THIS WE WANT TO MAKE SURE
- * DATA FROM THE LAST RECORD IS ELIMINATED.
- *FIRST MAKE SURE WE WANT TO ADD A RECORD
- @ 1,25 SAY mode
- @ 3,19 SAY morder picture '999999999'
- @ 3,53 SAY ' '
- @ 4,19 GET mlname
- @ 4,53 SAY mfname
- @ 5,19 SAY maddr1
- @ 6,19 SAY maddr2
- @ 7,19 SAY maddr3
- @ 8,19 SAY mcity
- @ 8,53 SAY mstate picture '!!'
- @ 8,70 SAY mzip picture '99999'
- @ 9,19 SAY ' '
- @ 9,53 SAY ' '
- @ 11,62 SAY mstatus
- @ 12,11 SAY mvol1
- @ 14,11 SAY mrem1
- @ 15,11 SAY mrem2
- @ 16,11 SAY mbo
- @ 17,53 SAY ' '
- @ 18,11 SAY ' '
- @ 18,35 SAY ' '
- @ 18,70 SAY ' '
- @ 20,12 SAY prompt1
- @ 21,12 SAY prompt2
- @ 22,12 SAY prompt3
- READ
- * IF WE DO WANT TO ADD A RECORD - THEN DO IT
- IF mlname <> ' '
- @ 1,25 SAY mode
- @ 3,19 SAY morder picture '999999999'
- @ 3,53 SAY ' '
- @ 4,19 SAY mlname
- @ 4,53 GET mfname
- @ 5,19 GET maddr1
- @ 6,19 GET maddr2
- @ 7,19 GET maddr3
- @ 8,19 GET mcity
- @ 8,53 GET mstate picture '!!'
- @ 8,70 GET mzip picture '99999'
- @ 9,19 GET mamt
- @ 9,53 SAY mentered picture '99/99/99'
- @ 11,62 SAY mstatus
- @ 12,11 SAY mvol1
- @ 14,11 SAY mrem1
- @ 15,11 SAY mrem2
- @ 16,11 SAY mbo
- @ 17,53 SAY ' '
- @ 18,11 SAY mbo:ship picture '99/99/99'
- @ 18,35 SAY mbo2:ship picture '99/99/99'
- @ 18,70 SAY mdayu picture '99/99/99'
- @ 20,12 SAY prompt1
- @ 21,12 SAY prompt2
- @ 22,12 SAY prompt3
- READ
- * ALWAYS USE CLEAR GETS AFTER GETS. OTHERWISE YOUR PROGRAM WILL
- * HAVE A HEART ATTACK. SEE PAGE 71 OF THE dbase manual
- CLEAR GETS
- * WE NOW GO TO PART 2 OF THE SCREEN. WE STORE 999
- * TO MVOL SO THAT ON OUR LAST RECORD WE CAN EXIT THE ADD EASIER
- STORE t TO getit
- STORE ' ' TO mstatus
- * ADD AS MANY RECORDS AS YOU WANT. MSTATUS SHOWS WHETHER THE
- * ITEM WAS IN STOCK. MVOL1 SHOWS WHAT WAS IN STOCK, MBO WHAT WAS
- * BACKORDERED. IF 999 NO MORE VOLUMES
- DO WHILE getit
- @ 11,62 SAY mstatus
- @ 12,11 SAY mvol1
- @ 16,11 SAY mbo
- @ 11,48 GET mvol
- READ
- @ 11,62
- CLEAR GETS
- IF mvol = 999
- STORE f TO getit
- STORE ' ' TO mstatus
- store f TO avoid
- * IF THE VOLUME WAS NOT 999 GO TO THE OTHER DATA BASE
- ELSE
- USE STOCK
- * FIND THE RECORD FOR THAT VOLUME. WE USE THE +1 BECAUSE OF VOL. 0
- * YOU COULD JUST AS EASILY (ALTHOUGH SLIGHTLY SLOWER) FIND
- * ANY DATA IN AN INDEXED OR NON-INDEXED FILE.
- * YOU COULD ALSO USE THE SELECT PRIMARY AND SECONDARY COMMAND HERE -
- * BUT FOR THIS DATA BASE, THIS IS THE SIMPLEST WAY OF DOING IT.
- LOCATE FOR # = mvol + 1
- * IF THE VOLUME WAS IN THE FILE
- IF .NOT. EOF
- GOTO mvol + 1
- * WE NEED ANOTHER CONTROL VARIABLE - WITHOUT IT VOLUMES NOT
- * IN THE FILE WOUND UP BEING WRITTEN TO THE BACKORDERED LIST
- STORE t TO avoid
- * WE NOW WRITE TO THE OTHER FILE AND ADJUST THE INVENTORY
- IF open:inv - back:ord - wait:ship + recvd + pend > 0
- REPLACE change1 WITH t
- REPLACE open:inv WITH open:inv -1
- STORE 'IN STOCK ' to mstatus
- REPLACE ship WITH ship + 1
- REPLACE daych1 WITH mentered
- ELSE
- REPLACE change2 WITH t
- REPLACE back:ord WITH back:ord+1
- STORE 'BACKORDER' TO mstatus
- REPLACE backship WITH backship + 1
- REPLACE daych2 WITH mentered
- ENDIF open:inv
- ELSE
- * if no such volume
- STORE 'TRY AGAIN ' TO mstatus
- STORE f TO avoid
- ENDIF .not. eof
- * BACK TO OUR MAIN DATA BASE
- * TELL THEM WHAT YOU FOUND AT STATUS AND LIST IT ON THE ORDER OR BACKORDER LINE
- * NOTE HOW WE BUILD UP THE STRING THAT IS THE LIST OF VOLUMES
- USE SIG/M
- IF avoid = t
- IF mstatus = 'IN STOCK'
- STORE TRIM(mvol1) + STR(mvol,3,0) + ',' TO mvol1
- ELSE
- STORE TRIM(mbo) + STR(mvol,3,0) + ',' TO mbo
- ENDIF mstatus = 'IN STOCK"
- ENDIF avoid
- ENDIF mvol
- ENDDO while getit
- * BLANK THE STATUS LINE AND GO TO PART 3 OF THE SCREEN AFTER 999
- * NOTE THAT YOU NEED NOT ENTER DATA IN THE ORDER IT APPEARS ON
- * THE SCREEN - WE DON'T KNOW IF THE ORDER IS COMPLETE OR BACKORDERED
- * UNTIL THE END. YOU SET THE ORDER - BUT DON'T DRIVE THE USER CRAZY.
- STORE ' ' TO mstatus
- @ 11,62 SAY mstatus
- @ 14,11 GET mrem1
- @ 15,11 GET mrem2
- @ 17,53 GET mcatalog picture '!'
- @ 18,11 GET mbo:ship picture '99/99/99'
- @ 18,35 GET mbo2:ship picture '99/99/99'
- @ 9,70 GET mshipped picture '99/99/99'
- @ 3,53 GET mcomp picture '!'
- READ
- CLEAR GETS
- * DETERMINE IF THERE IS INCOMPLETE OR INCORRECT DATA. THIS PART OF THE
- * PROGRAM CAN HANDLE A SUBSTANTIAL EDITING MODULE -
- DO CASE
- CASE .NOT. (mcomp = 'Y' .OR. mcomp = 'N')
- STORE t TO error
- CASE .NOT. (mcatalog = 'Y' .OR. mcatalog = 'N' .OR. mcatalog = 'B')
- STORE t TO error
- OTHERWISE
- STORE f TO error
- ENDCASE
- IF error
- @ 01,00
- @ 20,00
- @ 21,00
- @ 22,00
- @ 1,18 SAY 'Please Correct the Indicated Data'
- STORE t to an:error
- DO WHILE an:error
- DO CASE
- CASE .NOT. (mcomp = 'Y' .OR. mcomp = 'N')
- @ 21,15 SAY 'Must answer "Y" or "N" if shipping completed '
- @ 3,53 GET mcomp picture '!'
- READ
- @ 1,00
- CASE .NOT. (mcatalog = 'Y' .OR. mcatalog = 'N' .OR. mcatalog = 'B')
- @ 21,15 SAY 'Catalog is either "Y", "N" or "B" (backordered)'
- @ 17,53 GET mcatalog picture '!'
- READ
- @ 1,00
- OTHERWISE
- STORE f TO an:error
- ENDCASE
- ENDDO while an:error
- ENDIF error
- * GIVE THEM A SECOND TRY AT THE DATA. IN MOST CASES IT WILL BE CORRECT, BUT
- * WHY NOT GIVE THEM ANOTHER CRACK. IT IS SIMPLER TO REPEAT THE WHOLE ROUTINE
- * ALTHOUGH YOU COULD LOOP BACK TO THE BEGINNING. WE ALSO WANT A WAY TO
- * READJUST THE INVENTORY INCASE YOU PUT IN A WRONG VOLUME.
- STORE 'Y' TO command
- @ 20,00
- @ 21,00
- @ 22,00
- @ 21,15 SAY 'IS THE ABOVE CORRECT ? '
- @ 21,48 GET command picture '!'
- READ
- @ 21,00
- IF command = 'N'
- ERASE
- @ 04,00 SAY "DO YOU WANT TO ELIMINATE ANY VOLUMES ON THE ORDERED OR BACKORDER LIST ? "
- @ 04,70 GET command picture '!'
- READ
- IF command = 'Y'
- @ 06,00 SAY "Items you enter here will automatically be adjusted in the Inventory."
- @ 07,00 SAY "After you have made the changes you will then be able to edit"
- @ 08,00 SAY "the list of disks shipped and/or backordered."
- @ 09,00 SAY "Enter 999 when done"
- STORE t TO getit
- STORE 999 TO mvol
- DO WHILE getit
- @ 11,10 SAY "INVENTORY TO BE ADJUSTED FOR VOLUME "
- @ 14,02 SAY "Volumes"
- @ 14,11 SAY mvol1
- @ 16,00 SAY "Backorder"
- @ 16,11 SAY mbo
- @ 11,48 GET mvol
- READ
- CLEAR GETS
- IF mvol = 999
- STORE f TO getit
- ELSE
- USE STOCK
- LOCATE FOR # = mvol + 1
- IF .NOT. EOF
- GOTO mvol + 1
- DO CASE
- CASE open:inv - back:ord - wait:ship + recvd + pend > 0
- REPLACE open:inv WITH open:inv +1
- REPLACE ship WITH ship -1
- CASE (open:inv - back:ord - wait:ship + recvd + pend = 0 .AND. back:ord = 0)
- REPLACE open:inv WITH open:inv + 1
- REPLACE ship WITH ship -1
- CASE back:ord >0
- REPLACE back:ord WITH back:ord-1
- REPLACE backship WITH backship -1
- ENDCASE
- ENDIF .not. eof
- USE SIG/M
- ENDIF mvol
- ENDDO while getit
- * AT THIS POINT WE ARE DOING SOME TIGHT EDITING - SO PROTECT AGAINST
- * A SLIP OF THE FINGERS
- SET CONFIRM ON
- @ 11,10 SAY "Please adjust data 'Volumes' and/or 'Backorders' "
- @ 14,02 SAY "Volumes"
- @ 14,11 GET mvol1
- @ 16,00 SAY "Backorder"
- @ 16,11 GET mbo
- READ
- CLEAR GETS
- SET CONFIRM OFF
- * BACK TO NORMAL EDITING
- ENDIF command = Y
- * NOW THAT VOLUME NUMBERS TAKEN CARE OF WE CAN ADJUST THE REST OF
- * THE DATA
- ERASE
- STORE 'Add Records Module' TO mode
- STORE 'Enter as many records as you want.' TO prompt1
- STORE "When done, enter blank for last name " TO prompt2
- STORE "or Control 'Q' to end session" TO prompt3
- @ 1,25 SAY mode
- @ 2, 0 SAY "+---------------------------------------"
- @ 2,39 SAY "---------------------------------------+"
- @ 3, 5 SAY "ORDER NUMBER:"
- @ 3,43 SAY "Complete:"
- @ 4, 8 SAY "Last name:"
- @ 4,46 SAY "First:"
- @ 5,10 SAY "Address:"
- @ 6, 9 SAY "(line 2):"
- @ 7, 9 SAY "(line 3):"
- @ 8,13 SAY "City:"
- @ 8,46 SAY "State:"
- @ 8,65 SAY "ZIP:"
- @ 9,11 SAY "Amount:"
- @ 9,46 SAY "Enter:"
- @ 9,64 SAY "Ship "
- @ 11,00 SAY "Enter Individual Volumes Ordered (999 when done): "
- @ 12, 2 SAY "Volumes:"
- @ 14, 2 SAY "Remarks:"
- @ 16, 0 SAY "Backorder:"
- @ 17,44 SAY "Catalog:"
- @ 18, 2 SAY "Shipped:"
- @ 18,26 SAY "Shipped:"
- @ 18,62 SAY "Update:"
- @ 19, 0 SAY "+---------------------------------------"
- @ 19,39 SAY "---------------------------------------+"
- @ 20,12 SAY prompt1
- @ 21,12 SAY prompt2
- @ 22,12 SAY prompt3
- @ 3,19 GET morder picture '999999999'
- @ 3,53 SAY mcomp picture '!'
- @ 4,19 GET mlname
- @ 4,53 GET mfname
- @ 5,19 GET maddr1
- @ 6,19 GET maddr2
- @ 7,19 GET maddr3
- @ 8,19 GET mcity
- @ 8,53 GET mstate picture '!!'
- @ 8,70 GET mzip picture '99999'
- @ 9,19 GET mamt
- @ 9,53 SAY mentered picture '99/99/99'
- @ 9,70 SAY mshipped picture '99/99/99'
- @ 11,60 SAY mstatus
- @ 12,11 SAY mvol1
- @ 14,11 SAY mrem1
- @ 15,11 SAY mrem2
- @ 16,11 SAY mbo
- @ 17,53 SAY mcatalog
- @ 18,11 SAY mbo:ship picture '99/99/99'
- @ 18,35 SAY mbo2:ship picture '99/99/99'
- @ 18,70 SAY mdayu picture '99/99/99'
- READ
- CLEAR GETS
- STORE t TO getit
- STORE 999 TO mvol
- STORE ' ' TO mstatus
- DO WHILE getit
- @ 11,60 SAY mstatus
- @ 12,11 SAY mvol1
- @ 16,11 SAY mbo
- @ 11,48 GET mvol
- READ
- @ 11,60
- CLEAR GETS
- IF mvol = 999
- STORE f TO getit
- STORE ' ' TO mstatus
- STORE f TO avoid
- ELSE
- USE STOCK
- LOCATE FOR # = mvol + 1
- IF .NOT. EOF
- GOTO mvol + 1
- STORE t TO avoid
- IF open:inv - back:ord - wait:ship + recvd + pend > 0
- REPLACE change1 WITH t
- REPLACE open:inv WITH open:inv -1
- STORE 'IN STOCK ' to mstatus
- REPLACE ship WITH ship + 1
- REPLACE daych1 WITH mentered
- ELSE
- REPLACE change2 WITH t
- REPLACE back:ord WITH back:ord+1
- STORE 'BACKORDER' TO mstatus
- REPLACE backship WITH backship +1
- REPLACE daych2 WITH mentered
- ENDIF open:inv
- ELSE
- STORE 'TRY AGAIN ' TO mstatus
- STORE f TO avoid
- ENDIF .not. eof
- ENDIF mvol
- USE SIG/M
- IF avoid = t
- IF mstatus = 'IN STOCK'
- STORE TRIM(mvol1) + STR(mvol,3,0) + ',' TO mvol1
- ELSE
- STORE TRIM(mbo) + STR(mvol,3,0) + ',' TO mbo
- ENDIF mstatus
- ENDIF avoid
- ENDDO while getit
- STORE ' ' TO mstatus
- @ 11,60 SAY mstatus
- @ 14,11 GET mrem1
- @ 15,11 GET mrem2
- @ 17,53 GET mcatalog picture '!'
- @ 18,11 GET mbo:ship picture '99/99/99'
- @ 18,35 GET mbo2:ship picture '99/99/99'
- @ 9,70 GET mshipped picture '99/99/99'
- @ 3,53 GET mcomp picture '!'
- READ
- CLEAR GETS
- ENDIF command = N
- * OUR ADDING AND EDITING IS DONE - LET US ADD THE RECORD TO THE FILE
- APPEND BLANK
- REPLACE order WITH morder, comp WITH mcomp
- REPLACE lname WITH mlname, fname WITH mfname
- REPLACE addr1 WITH maddr1, addr2 WITH maddr2, addr3 WITH maddr3
- REPLACE city WITH mcity, state WITH mstate, zip WITH mzip
- REPLACE vol1 WITH mvol1
- REPLACE amt WITH mamt
- REPLACE entered WITH mentered, shipped WITH mshipped
- REPLACE rem1 WITH mrem1, rem2 WITH mrem2
- REPLACE bo WITH mbo, catalog WITH mcatalog, bo:ship WITH mbo:ship
- REPLACE bo2:ship WITH mbo2:ship, dayu WITH mdayu
- REPLACE new WITH t
- STORE t TO more
- ELSE
- STORE f TO more
- ENDIF mlname = ' '
- ENDDO while more
- * IF NO MORE RECORDS TO BE ADDED - ASK IF THEY WANT TO INDEX
- STORE 'Y' TO command
- ERASE
- @ 02,10 SAY 'The newly added ORDERS will NOT appear'
- @ 03,10 SAY 'to be in the File until they are RE-INDEXED'
- @ 04,10 SAY 'and this will take some time....'
- @ 06,10 SAY 'You may re-index now or by using the'
- @ 07,10 SAY 'Maintenance Function number 6'
- @ 10,10 SAY 'Do you wish to RE-INDEX records NOW (Y/N)'
- @ 10,52 GET command PICTURE '!'
- READ
- IF command = 'Y'
- @ 14,10 SAY 'Records are now being re-indexed. '
- @ 16,10 SAY 'Please be patient as this takes a little time....'
- STORE CHR(PEEK(063)) TO dr
- INDEX ON !(lname) TO &dr.:orders
- ENDIF command = y
- * get our drive letter
- STORE CHR(PEEK(063)) TO dr
- SET INDEX TO &dr.:orders
- RELEASE ALL
- * set the colons back on
- SET COLON ON
- STORE t TO first